// #include <iostream>
// #include <cstdlib>
// #include <sys/types.h>
// #include <sys/wait.h>
// #include <unistd.h>

// #include "HttpServer.hpp"
// #include "Daemon.hpp"


// // void Login(HttpRequest& req, HttpResponse& resp)
// // {
// //     LOG(LogLevel::DEBUG) << "进入登录模块" << req.Path() << ", " << req.Args();
// //     std::string req_args = req.Args();

// //     //1,解析参数格式，得到想要的参数

// //     //2,访问数据库，验证对应的用户是否是合法的用户，其他工作

// //     //3，登录成功
// //     std::string body = req.GetContent("wwwroot/success.html");
// //     resp.SetCode(200);
// //     resp.SetHeader("Content-Length", std::to_string(body.size()));
// //     resp.SetHeader("Content-Type", "text/html");
// //     resp.SetHeader("Set-Cookie", "usename=zhangsan&passwd=111111111");
// //     resp.SetBody(body);

// //     // resp.SetCode(302);
// //     // resp.SetHeader("Location", "/");
// // }

// void HandlePythonRequest(HttpRequest &req, HttpResponse &resp)
// {
//     pid_t pid = fork();
//     if (pid == 0)
//     {
//         // 子进程：执行Python脚本
//         char *args[] = {
//             (char *)"python3",
//             (char *)"printy.py",
//             (char *)req.Args().c_str(),
//             NULL};
//         LOG(LogLevel::DEBUG) << "进入搜索模块HandlePythonRequest1111, " << req.Args();
//         execvp("/usr/bin/python3", args);
//         LOG(LogLevel::DEBUG) << "进入搜索模块HandlePythonRequest2222, " << req.Args();

//         exit(EXIT_FAILURE);
//     }
//     else if (pid > 0)
//     {
//         // 父进程：等待子进程完成
//         int status;
//         waitpid(pid, &status, 0);
//         if (WIFEXITED(status))
//         {
//             resp.SetBody("Python script executed successfully");
//         }
//     }
// }

// void Resister(HttpRequest &req, HttpResponse &resp)
// {
//     // 根据req，动态构建resp
//     LOG(LogLevel::DEBUG) << "进入注册模块" << req.Path() << ", " << req.Args();
// }

// void Search(HttpRequest &req, HttpResponse &resp)
// {
//     // 根据req，动态构建resp
//     LOG(LogLevel::DEBUG) << "进入搜索模块" << req.Path() << ", " << req.Args();
// }
// void Test(HttpRequest &req, HttpResponse &resp)
// {
//     // 根据req，动态构建resp
//     LOG(LogLevel::DEBUG) << "进入测试模块" << req.Path() << ", " << req.Args();
// }

// int main()
// {
//     // Daemon(false, false);
//     auto httpserver = std::make_unique<HttpServer>(8089);

//     // httpserver->Resgiter("/login", Login); //result 风格的网络请求接口
//     // httpserver->Resgiter("/register", Resister); // result 风格的网络请求接口
//     // httpserver->Resgiter("/search", Search);     // result 风格的网络请求接口
//     // httpserver->Resgiter("/test", Test);         // result 风格的网络请求接口

//     httpserver->Resgiter("/python", HandlePythonRequest);

//     httpserver->Start();
//     return 0;
// }


#include "HttpServer.hpp"
#include "Daemon.hpp"
#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <codecvt>  // 添加编码转换头文件
// 函数声明
void HandlePythonRequest(HttpRequest &req, HttpResponse &resp);
void Resister(HttpRequest &req, HttpResponse &resp);
void Search(HttpRequest &req, HttpResponse &resp);
void Test(HttpRequest &req, HttpResponse &resp);

// void HandlePythonRequest(HttpRequest &req, HttpResponse &resp)
// {
//     pid_t pid = fork();
//     if (pid == 0)
//     {
//         // 显式转换为UTF-8并过滤无效字符
//         std::string arg_utf8 = req.Args();
//         char *arg = const_cast<char*>(arg_utf8.c_str());

//         char *args[] = {
//             (char *)"python3",
//             (char *)"/home/wks/linux-beginner-learning/socketHttp40/1.httpserver/printy.py",
//             arg,
//             NULL
//         };

//         LOG(LogLevel::DEBUG) << "进入搜索模块HandlePythonRequest1111, args: " << arg_utf8;
//         if (execvp("/usr/bin/python3", args) == -1) {
//             perror("execvp failed");
//             LOG(LogLevel::ERROR) << "Failed to execute Python script: " << strerror(errno);
//         }
//         exit(EXIT_FAILURE);
//     }
//     else if (pid > 0)
//     {
//         int status;
//         waitpid(pid, &status, 0);
//         if (WIFEXITED(status))
//         {
//             // 读取Python输出
//             std::string python_output = resp.Body();
            
//             // 解析重定向指令
//             if (python_output.find("REDIRECT:") == 0) {
//                 std::string url = python_output.substr(9);
//                 resp.SetCode(302);
//                 resp.SetHeader("Location", url);
//                 resp.SetBody("Redirecting...");
//             } else {
//                 resp.SetBody(python_output);
//             }
//         }
//     }
// }

void HandlePythonRequest(HttpRequest &req, HttpResponse &resp)
{
    int pipe_fds[2];
    if (pipe(pipe_fds) == -1) {
        perror("pipe failed");
        return;
    }

    pid_t pid = fork();
    if (pid == 0)
    {
        // 子进程：重定向 stdout 到管道
        close(pipe_fds[0]);  // 关闭读端
        dup2(pipe_fds[1], STDOUT_FILENO);
        close(pipe_fds[1]);

        // 执行 Python 脚本...
        char *arg = (char *)req.Args().empty() ? NULL : (char *)req.Args().c_str();
        char *args[] = {
            (char *)"python3",
            (char *)"/home/wks/linux-beginner-learning/socketHttp40/1.httpserver/printy.py",
            arg,
            NULL
        };

        LOG(LogLevel::DEBUG) << "进入搜索模块HandlePythonRequest1111, args: " << req.Args();
        if (execvp("/usr/bin/python3", args) == -1) {
            perror("execvp failed");
            LOG(LogLevel::ERROR) << "Failed to execute Python script: " << strerror(errno);
        }
        exit(EXIT_FAILURE);
    }
    else if (pid > 0)
    {
        close(pipe_fds[1]);  // 关闭写端

        // 读取管道数据
        char buffer[4096];
        std::string python_output;
        ssize_t bytes_read;
        while ((bytes_read = read(pipe_fds[0], buffer, sizeof(buffer))) > 0) {
            python_output.append(buffer, bytes_read);
        }
        close(pipe_fds[0]);

        // 解析重定向指令
        if (python_output.find("REDIRECT:") == 0) {
            std::string url = python_output.substr(9);
            resp.SetCode(302);
            resp.SetHeader("Location", url);
            resp.SetBody("Redirecting...");
        } else {
            resp.SetBody(python_output);  // 使用 Python 输出作为响应体
        }

        waitpid(pid, nullptr, 0);
    }
}
void Resister(HttpRequest &req, HttpResponse &resp)
{
    // 根据req，动态构建resp
    LOG(LogLevel::DEBUG) << "进入注册模块" << req.Path() << ", " << req.Args();
}

void Search(HttpRequest &req, HttpResponse &resp)
{
    // 根据req，动态构建resp
    LOG(LogLevel::DEBUG) << "进入搜索模块" << req.Path() << ", " << req.Args();
}

void Test(HttpRequest &req, HttpResponse &resp)
{
    // 根据req，动态构建resp
    LOG(LogLevel::DEBUG) << "进入测试模块" << req.Path() << ", " << req.Args();
}

int main()
{
    Daemon(false, false);
    auto httpserver = std::make_unique<HttpServer>(8089);

    // httpserver->Resgiter("/login", Login); //result 风格的网络请求接口
    // httpserver->Resgiter("/register", Resister); // result 风格的网络请求接口
    // httpserver->Resgiter("/search", Search);     // result 风格的网络请求接口
    // httpserver->Resgiter("/test", Test);         // result 风格的网络请求接口

    // httpserver->Resgiter("/python", HandlePythonRequest);

    httpserver->Start();
    return 0;
}